package com.cskaoyan.javase.oop1._11static._2compare;

/**
 * 当我们了解static成员的特点后，静态成员和非静态成员的区别就很明显
 * 我们从以下四个角度比较（拿成员变量为例）
 *      1.成员的所属
 *          成员变量: 对象
 *          静态成员变量: 类
 *      2.在内存中的位置
 *          成员变量: 在对象中存储
 *          静态成员变量: 存储在堆上,一片被全体对象共享的区域,属于类
 *      3.在内存中出现的时间
 *          成员变量: 创建对象之后才存在
 *          静态成员变量: 类加载之后就存在了
 *          静态成员变量在前出现,成员变量在后出现,这是一定的
 *          而且:
 *          成员变量存在就意味着静态成员变量一定存在
 *          反过来不成立,静态成员变量存在,并不一定存在成员变量
 *          因为类加载的时机很多,不仅有new对象
 *
 *      4.调用方式
 *          成员变量: 必须使用"对象名点"访问
 *          静态成员变量: 应该使用"类名点"访问
 *              虽然可以用"对象名点"
 *              但这种做法不正确是错误的
 *
 * 以上是成员变量,和静态成员变量
 * 实际上静态成员方法,和成员方法也有类似的区别
 * 1.在成员方法中,能够访问类的成员,静态成员的哪些?
 *      成员方法中隐含this传参,已经存在当前类的对象了
 *      所以可以直接访问类的成员(变量,方法)
 *      当然也可以直接访问类的静态成员(因为对象都存在了,类加载一定进行了)
 *
 * 2.在静态成员方法中,能够访问类的成员,静态成员的哪些?
 *      可以访问静态成员(因为它们都是类加载完毕后,就可以使用了)
 *      但是不能访问类的成员
 *      因为类加载,并不一定创建对象
 *      静态成员方法中没有this传参,没有对象
 *
 *      虽然不能直接访问类的成员
 *      但是并不是说完全无法访问
 *      想要访问,直接new对象,然后访问,也是可以的
 *
 *
 * @since 15:42
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
}

class A {
    int num = 666;
    static int staticNum = 777;

    public void test() {
        System.out.println(num);
        System.out.println(staticNum);
        testStatic();
    }

    public static void testStatic() {
        System.out.println(staticNum);
        // System.out.println(num);
        A a = new A();
        System.out.println(a.num);
        a.test();
    }
}